"=============================================================================="
" __  ____   __ __     _____ __  __ ____   ____
"|  \/  \ \ / / \ \   / /_ _|  \/  |  _ \ / ___|
"| |\/| |\ V /   \ \ / / | || |\/| | |_) | |
"| |  | | | |     \ V /  | || |  | |  _ <| |___
"|_|  |_| |_|      \_/  |___|_|  |_|_| \_\\____|
"=============================================================================="
"" 配置文件位置    ~/.SpaceVim.d/myspacevim.vim
"" 注释：以 " 开头的部分是注释
"=============================================================================="
" 载入用户配置
function! myspacevim#before() abort

	" 启动后自动切换到用户目录下(此处配置用户防止绿色版启动时跑到安装目录)
	execute ":cd  ~"
	set showcmd                  " 在状态栏显示命令状态   
	set backspace=2              " 允许将一行退格到上面一行的结尾
	" 基础高亮配置
		" 延时禁用让Vim查找/替换后一段时间自动取消高亮，发生查找时自动开启
		" 当光标一段时间保持不动了，就禁用高亮
		autocmd cursorhold * set nohlsearch
		" 当输入查找命令时，再启用高亮
		noremap n :set hlsearch<cr>n
		noremap N :set hlsearch<cr>N
		noremap / :set hlsearch<cr>/
		noremap ? :set hlsearch<cr>?
		noremap * *:set hlsearch<cr>
	
		" 最近行显示高亮配置
		"set cursorline cursorcolumn    " 高亮最近行
		set cursorline nocursorcolumn  " 不高亮最近行
		au WinLeave * set nocursorline nocursorcolumn
		au WinEnter * set cursorline cursorcolumn
	
		" 查找结果高亮显示设置
		" 更多的CTERM颜色可以查阅：http://vim.wikia.com/wiki/Xterm256_color_names_for_console_Vim
	
		highlight Search ctermbg=yellow ctermfg=black 
		highlight IncSearch ctermbg=black ctermfg=yellow 
		highlight MatchParen cterm=underline ctermbg=NONE ctermfg=NONE
	
	
	" 查找时大小写敏感配置
		set ignorecase                 " 设置默认进行大小写不敏感查找
		set smartcase                  " 如果有一个大写字母，则切换到大小写敏感查找
	
	" 基础窗口美化设置
		"set nu                        " 可以在每一行的最前面显示行号啦！
		"set list                      " 显示制表格^I、Windows换行符^M,Unix结尾符$
		"set nolist                    " 不显示制表格^I、结尾符$
		"set nowrap                    " 不自动换行    dont wrap lines
		set wrap                      " 自动换行    dont wrap lines

	"设置tab键输入变为4个空格
		"set shiftwidth=4
		"set softtabstop=4
		"set tabstop=4
		"set expandtab
		"set autoindent " 解释：set autoindent Tab键的宽度 当设置成 expandtab 时，缩进用空格来表示，noexpandtab 则是用制表符表示一个缩进。set softtabstop=4 set shiftwidth=4 Tab键的宽度
	
	" 前缀键设置   <leader>键设置 前缀键默认为 " \ ” 
		" 使用:help <leader>命令，可以查看关于前缀键的更多信息
		" 参考资料[VIM学习笔记 前缀键(leader)](https://zhuanlan.zhihu.com/p/63626180)
	
		"将前缀键定义为逗号
		"let mapleader=","  
		" 将前缀键设置为空格键
		"let mapleader = "\<spacer"


	" 代码折叠相关说明与配置
		"set foldmethod=indent  " 设置成 indent 折叠方式（更多的缩进表示更高级别的折叠）
		"set foldcolumn=3       " 命令定义了左折叠栏的宽度，默认是0。该栏用“|”显示折叠层次。
		"set fdm=indent        "set foldmethod=indent的简写 
		" 确认折叠功能开启:set foldenable
		" ：set fdm?      " 参考当前的折叠模式
			" vim 提供 6中折叠方式(默认省缺下为manual手工定义折叠)
			"    manual            手工定义折叠
			"    indent            更多的缩进表示更高级别的折叠
			"    expr              用表达式来定义折叠
			"    syntax            用语法高亮来定义折叠
			"    diff              对没有更改的文本进行折叠
			"    marker            对文中的标志折叠
	
			" manual 模式  ( 手工定义折叠 ）它的命令是通用的，掌握了manual的基本命令，折叠也就差不多
				" za    切换折叠状态，
				" zc    关闭折叠，就是折叠起来，
				" zo    打开折叠，
				" zd    删除折叠，当a、c、d、o大写时，则动作是递归的。
				" zf    创建折叠是zf结合光标移动命令（将光标放在函数的开括号上，用zf%，可方便的将函数折起来）。
				" zr    减少折叠 也就是取消折叠吧标志也取消了
				" zm    折叠更多 
				" zM    减少到一个也不剩
				" zm    折叠更多
				" 举例说明：  
					"    把光标置于某一段落内，并命令模式下键入 zfap 你将会看到该段落被一行高亮的文本所代替。你已经创建一个折叠了。 zf 是个操作符，而 ap 是一个文本对象。
					"    你可以将 zf 操作符跟任何一个移动命令联用，为所经之处的文本创建一个折叠。 (如：zf56G，创建从当前行起到56行的代码折叠；)
					"    zf 也能在可视模式下使用。
	
	
			" indent 模式  ( 更多的缩进表示更高级别的折叠 ）
				"    zi      打开/关闭折叠
				"    zc      折叠
				"    zC      对所在范围内所有嵌套的折叠点进行折叠
				"    zo      展开折叠
				"    zO      对所在范围内所有嵌套的折叠点展开
				"    [z      到当前打开的折叠的开始处。
				"    ]z      到当前打开的折叠的末尾处。
				"    zj      向下移动。到达下一个折叠的开始处。关闭的折叠也被计入。
				"    zk      向上移动到前一折叠的结束处。关闭的折叠也被计入。
				"    注：使用时在缩进处输入命令，缩进处需要四个空格或一个Tab键的长度
	
			" marker模式    
				"需要用标计来标识代码的折叠，系统默认是{{{和}}}，最好不要改动之
				" zf  创建折叠，比如在marker方式下：
				"        zf56G，创建从当前行起到56行的代码折叠；
				"        10zf或10zf+或zf10↓，创建从当前行起到后10行的代码折叠。
				"        10zf-或zf10↑，创建从当前行起到之前10行的代码折叠。
				"        在括号处zf%，创建从当前行起到对应的匹配的括号上去（（），{}，[]，等）。
				" zd  删除 (delete) 在光标下的折叠。仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
				" zD  循环删除 (Delete) 光标下的折叠，即嵌套删除折叠。
				"     仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
				" zE  除去 (Eliminate) 窗口里“所有”的折叠。
				"     仅当 'foldmethod' 设为 "manual" 或 "marker" 时有效。
	
			" vim提供4种缩排，:set indenttype? (查看当前缩排)
			" indenttyep可为:
				" autoindent
				" smartindent
				" cindent
				" indentexpr
				" 其中，autoindent与vi的autoindent类似，smartindent则是对其做了点加强，
	
		" 注意，每一种折叠方式不兼容，即：你不能用expr又用marker方式。
		" > 参考资料
		" + [Vim 折叠](https://www.jianshu.com/p/16e0b822b682)
		" + [vim 中代码的折叠和打开](https://blog.csdn.net/woshicsdn7547/article/details/45364047)
		" + [vim的折叠、智慧缩排](https://blog.csdn.net/strategycn/article/details/7897895)

	" 快捷键或命令配置
		"<F2>设置是否显示行号
		" nnoremap <silent> <F2> :set number!<CR>
		nnoremap <Leader>sn :set number!<CR>  " 显示与隐藏行号
		nnoremap <Leader>sl :set list!<CR>    " 显示与隐藏制表符与换行符
		nnoremap <Leader>sw :set wrap!<CR>    " 自动换行与不自动换行
		"使用python3
		"let g:pymode_python = '~/AppData/Local/Programs/Python/Python38-32/python.exe'  
endfunction

" 启动函数 VimEnter autocmd后执行
function! myspacevim#after() abort

	"-----------------------------------------------------------------------------
	" 自动动作配置
	" 设置 启动vim时的工作目录
	let g:Source="~"   " 用户目录
	"set autochdir     " 自动切换到当前编辑的文件所在路径 会与NERDTree冲突
	" 手动切换到当前选中文件所在目录路径 :cd %:p:h
	nnoremap <leader>. :cd %:p:h<cr>
	" 打开自动定位到最后编辑的位置, 需要确认.viminfo当前用户可写
	if has("autocmd")
		au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
	endif

	"关闭最后一个文件编辑buffer窗口时，自动退出其余所有NERDTree、Quickfix窗口
	"autocmd BufEnter * if 0 == len(filter(range(1, winnr('$')), 'empty(getbufvar(winbufnr(v:val), "&bt"))')) | qa! | endif

	"关闭最后一个文件编辑buffer窗口时，打开 vim-project 面板(需要安装amiorin/vim-project插件)
	"autocmd BufEnter * if 0 == len(filter(range(1, winnr('$')), 'empty(getbufvar(winbufnr(v:val), "&bt"))')) | Welcome | endif
	
	"关闭最后一个文件编辑buffer窗口时，打开 Startify 面板(需要安装mhinz/vim-startify插件)
	autocmd BufEnter * if 0 == len(filter(range(1, winnr('$')), 'empty(getbufvar(winbufnr(v:val), "&bt"))')) | Startify | endif
" -----------------------------------------------------------------------------
" 快捷菜单插件 skywind3000/quickmenu.vim 配置

	" 使用说明

	" 配置
		" 允许显示命令行帮助（ H ），以及 cursorline （ L ）
		let g:quickmenu_options = "LH"

		" 清除当前目录中所有内容
		call g:quickmenu#reset()

		" 设置 打开：显示 /隐藏 该菜单面板快捷键
		noremap <silent><F12> :call quickmenu#toggle(0)<cr>  " <F12> 键打开
		"noremap <silent><space> :call quickmenu#toggle(0)<cr> " 空格键打开
		" 由井号开始的字符串表示一个分组
		" 分组1 : UI
		call g:quickmenu#append('# UI', '')
		call g:quickmenu#append('打开首页',               ':Startify',               '执行:Startify')
		call g:quickmenu#append('自动换行',               ':set wrap!',              '执行:set wrap! 快捷键 <leader>sw')
		call g:quickmenu#append('制表符换行符显隐',       ':set list!',              '执行:set list! 快捷键 <leader>sl')
		call g:quickmenu#append('目录树NERDTree',         ':NERDTReeToggle',         '执行:NERDTReeToggle')
		call g:quickmenu#append('撤销树Undotree',         ':UndotreeToggle',         '执行:UndotreeToggle')
		call g:quickmenu#append('标签列表Tlist',          ':TlistToggle',            '执行:TlistToggle')
		call g:quickmenu#append('任务标签列表Tasklist',   ':TaslistToggle',          '执行:TaslistToggle')
		call g:quickmenu#append('缩进指示线indentLine',   ':IndentLinesToggle',      '执行:IndentLinesToggle')

		" 分组2 : Git
		call g:quickmenu#append('# Git', '')
		call g:quickmenu#append('查看git日志',   ':Glog',   '执行:Glog')
		call g:quickmenu#append('查看git blame', ':Gblame', ':执行:Gblame')

		" 第三方软件打开
		call g:quickmenu#append('# 第三方软件预览', '')
		call g:quickmenu#append('chrome预览',   ':Chrome', '执行:Chrome')
		call g:quickmenu#append('PowerShell',   'call OpenFolderWithApp("PowerShell")', ':执行:call OpenFolderWithApp("PowerShell")')
		"call g:quickmenu#append('Git-bash',     'call OpenFolderWithApp("Git-Bash")', ':执行:call OpenFolderWithApp("Git-Bash")')
		"call g:quickmenu#append('Git-gui',      'call OpenFolderWithApp("Git-Gui")', ':执行:call OpenFolderWithApp("Git-Gui")')

	" 自定义函数
		call g:quickmenu#append('# 自定义函数', '')
		call g:quickmenu#append('复制当前文件目录地址到剪贴板',   ':call GetCurFilePath()', '执行: call GetCurFilePath()')
		
	" 帮助/助记
		call g:quickmenu#append('# 帮助/助记','')
		call g:quickmenu#append('底部打开命令窗口 快捷键Alt+=',':Term','执行快捷键，或用相关插件的配置Alt+=')
		call g:quickmenu#append('关闭Buff',':bd', '执行:bd')
	" > 参考资料
		" + [漂亮的 Vim 弹出菜单插件](https://www.v2ex.com/amp/t/376762) 
		" + [skywind3000/quickmenu.vim](https://github.com/skywind3000/quickmenu.vim)
	


	"-----------------------------------------------------------------------------
	" 树形目录插件 scrooloose/nerdtree 配置

	" 使用说明
		"        ?   快速帮助文档
		"        o   打开一个目录或者打开文件，创建的是 buffer，也可以用来打开书签
		"        go  打开一个文件，但是光标仍然留在 NERDTree，创建的是 buffer
		"        t   打开一个文件，创建的是Tab，对书签同样生效
		"        T   打开一个文件，但是光标仍然留在 NERDTree，创建的是 Tab，对书签同样生效
		"        i   水平分割创建文件的窗口，创建的是 buffer
		"        gi  水平分割创建文件的窗口，但是光标仍然留在 NERDTree
		"        s   垂直分割创建文件的窗口，创建的是 buffer
		"        gs  和 gi，go 类似
		"        x   收起当前打开的目录
		"        X   收起所有打开的目录
		"        e   以文件管理的方式打开选中的目录
		"        r   刷新光标所在的目录
		"        R   刷新当前根路径
		"        p   小写，跳转到光标所在的上一级路径
		"        P   大写，跳转到当前根路径
		"        J   到第一个节点
		"        K   到最后一个节点
		"        I   显示隐藏文件
		"        m   显示文件操作菜单
		"        C   将根路径设置为光标所在的目录
		"        u       设置上级目录为根路径
		"        :tabc   关闭当前的 tab
		"        :tabo   关闭所有其他的 tab
		"        :tabp   前一个 tab
		"        :tabn   后一个 tab
		"        gT      前一个 tab
		"        gt      后一个 tab

	" 配置
		" 打开位置居左居右与初始化宽度配置设置（默认居左）
		" let NERDTreeWinPos = 'right'  "居右
		" let NERDTreeWinPos = 'left'   "居左
		" let g:netrw_winsize = 35

		"" 初始化时不打开nerd_tree窗口（默认不打开）
		" let g:nerdtree_tabs_open_on_gui_startup = 1 " 打开
		let g:nerdtree_tabs_open_on_gui_startup = 0   " 不打开

		" 显示行号
		let NERDTreeShowLineNumbers=1
		let NERDTreeAutoCenter=1
		" 是否显示隐藏文件
		let NERDTreeShowHidden=1
		" 设置宽度
		let NERDTreeWinSize=31
		" 在终端启动vim时，共享NERDTree
		let g:nerdtree_tabs_open_on_console_startup=1
		" 忽略一下文件的显示
		let NERDTreeIgnore=['\.pyc','\~$','\.swp']
		" 显示书签列表
		let NERDTreeShowBookmarks=1

		let g:NERDTreeDirArrowExpandable = '▸'
		let g:NERDTreeDirArrowCollapsible = '▾'

		" 开关树形目录的快捷键：
		"map <C-n> :NERDTreeToggle<CR>   " Ctrl + n 开关
		"map <F2> :NERDTreeToggle<CR>   " F2 开关
		" nmap <F6> :NERDTreeToggle<cr> " F6 开关
		noremap <Leader>ne :NERDTreeToggle<CR>

		" 注：
			" 上边的<C-n>表示Ctrl + n，而:NERDTreeToggle 表示对应的命令。
			" <CR>表示回车。

	"-----------------------------------------------------------------------------
	" 在 NERDTree 中显示 git 信息插件：nerdtree-git-plugin
	" 使用说明
		" 前提：安装 nerdtree 、需要安装相应字体才能完整使用
	
	" 配置（需安装相应字体才能完整使用）
		let g:NERDTreeShowIgnoredStatus = 1
		let g:NERDTreeIndicatorMapCustom = {
			\ "Modified"  : "✹",
			\ "Staged"    : "✚",
			\ "Untracked" : "✭",
			\ "Renamed"   : "➜",
			\ "Unmerged"  : "═",
			\ "Deleted"   : "✖",
			\ "Dirty"     : "✗",
			\ "Clean"     : "✔︎",
			\ 'Ignored'   : '☒',
			\ "Unknown"   : "?"
			\ }

	"-----------------------------------------------------------------------------
	" 标签列表插件 vim-scripts/taglist.vim

	" 使用说明，
		"    最常用的几个命令：
		"     可以用“:TlistOpen”打开taglist窗口，用“:TlistClose”关闭taglist窗口。或者使用“:TlistToggle”在打开和关闭间切换。
		"     :Tlist
		"     Ctrl + ]    " 把光标移到变量名或函数名上，然后按,直接跳到这个变量或函数定义的源文件中
		"     Ctrl+t      " 可以退回原来的地方
		"     Ctrl + o
		"     Ctrl + W W
		"     在taglist窗口中，可以使用下面的快捷键：
		"     <CR>                                   跳到光标下tag所定义的位置，用鼠标双击此tag功能也一样
		"     o                                      在一个新打开的窗口中显示光标下tag
		"     <Space>                                显示光标下tag的原型定义
		"     u                                      更新taglist窗口中的tag
		"     s                                      更改排序方式，在按名字排序和按出现顺序排序间切换
		"     x                                      taglist窗口放大和缩小，方便查看较长的tag
		"     +                                      打开一个折叠，同zo
		"     -                                      将tag折叠起来，同zc
		"     *                                      打开所有的折叠，同zR
		"     =                                      将所有tag折叠起来，同zM
		"     [[                                     跳到前一个文件
		"     ]]                                     跳到后一个文件
		"     q                                      关闭taglist窗口
		"     <F1>                                   显示帮助 
		"      rebuild_ctags                         -重建ctags索引    ctrl+t     ctrl+r      组合键
		"      navigate_to_definition                -跳转到函数定义   ctrl+t     ctrl+t
		"      jump_back                             -跳回             ctrl+t     ctrl+b
		"      jump_back to_last_modification        -跳转到上次修改处 ctrl+t     ctrl+m
		"      show_symbols                          -按函数索引查找   alt+s

	" 配置
		let Tlist_Use_Right_Window=1        "  1让窗口显示在右边，0的话就是显示在左边
		let Tlist_Show_One_File=0           "  让taglist可以同时展示多个文件的函数列表
		let Tlist_File_Fold_Auto_Close=1    "  非当前文件，函数列表折叠隐藏
		let Tlist_Exit_OnlyWindow=1         "  当taglist是最后一个分割窗口时，自动推出vim
		" 使用winmanager时，不使用快捷键
		nnoremap <silent> <F8> :TlistToggle<CR>
		noremap <Leader>tl :TlistToggle<CR>
		" 启动Vim后，自动打开taglist窗口。
		" 使用winmanager时，将自动打开窗口关闭
		" let Tlist_Auto_Open = 0

	"-----------------------------------------------------------------------------
	" 任务列表插件：列出TODO与FIXME等备注插件 vim-scripts/TaskList.vim

	" 使用方法，
		"      在 Normal 模式下，依次按下 , + t + d，任务列表出现在下面的 Preview 窗口中，可以选择对应的条目，按回车键跳转过去
		"      :TaskList

	" 配置
		let g:tlTokenList = ["FIXME","TODO", "HACK", "NOTE", "WARN", "MODIFY"]  " 任务列表搜索的标识符列表，默认是 'FIXME TODO XXX'. 搜索到得结果按照分组和出现顺序排列.
		let g:tlWindowPosition = 1                                              " 指定任务列表窗口打开位置，默认是窗口上方打开，1 窗口上方底部打开
		let g:tlRememberPosition = 1                                            " 默认是找到离光标当前行最近的标示符；如果设置为1，则任务插件下次打开时会恢复到上次关闭时的位置. 

		" 绑定快捷键，默认是 <Leader>t
		"nnoremap    ,td             :TaskList<CR>


	"-----------------------------------------------------------------------------
	" 项目里全局搜索某个单词插件  mileszs/ack.vim

	" 使用方法，
		"      :Ack xxx                 在项目里搜索xxx单词.
		"      :Ack! TODO               
		"      :Ack! 'TODO\|FIXME'      

	" 安装前提：需要安装ack
		"    windows: (1)下载并安装 Strawberry Perl 【地址（http://strawberryperl.com/）】
		"             (2). 创建一个目录 c:/tools_bin，并将该目录添加到系统 PATH 环境变量
		"             
		"             (3). 下载 ack 脚本 （http://betterthangrep.com/ack-standalone）
		"                   放到 c:/tools_bin/ack.pl
		"                 
		"             (4). 创建一个批处理文件 c:/tools_bin/ack.bat 内容如下:
		"                   @echo off
		"                   perl.exe c:/tools_bin/ack.pl %*
		"    linux: archlinux安装ack: sudo acman -S ack
		"
		"    mac:安装ack:brew install ack

		" let g:ackprg="ack// -H// --nocolor// --nogroup"
		" 
		" if executable('ag')
		"  let g:ackprg = 'ag --nogroup --nocolor --column'
		" endif


	" 配置
		" 创建，命令映射
		" :command Todo  Ack! 'TODO\|FIXME\|CHANGED\|BUG\|HACK'   " 此种写法Windows上会报错，目前一次只能匹配搜一个单词
		" :command Debug Ack! 'NOTE\|INFO\|IDEA'                  " 此种写法报错
		:command Todo Ack! TODO

		" 相关高亮配置
		" Vim里面会自动的高亮TODO、FIXME，但是不会高亮CHANGED这样的关键字，所以需要手动的来指定一下
		if has("autocmd")
			" Highlight TODO, FIXME, NOTE, etc.
			if v:version > 701
				autocmd Syntax * call matchadd('Todo', '\W\zs\(TODO\|FIXME\|CHANGED\|BUG\|HACK\)')
				autocmd Syntax * call matchadd('Debug', '\W\zs\(NOTE\|INFO\|IDEA\)')
			endif
		endif

" -----------------------------------------------------------------------------
" 模糊搜索 'junegunn/fzf.vim'、'junegunn/fzf' 

	" 安装前提：需要安装fzf
		"    windows: (1)下载并安装 （如：fzf-0.20.0-windows_amd64.zip）
		"             (2). 解压到一个目录下，如创建一个目录 c:/tools_bin/fzf-20.0-windows_amd64，并将该目录添加到系统 PATH 环境变量
		"                 
		"    linux: Archlinux安装fzf: sudo pacman -S fzf
		"
		"    mac:安装fzf:brew install fzf
	" 使用
		" :FZF                  当前文件夹文件搜索切换 
		" :Files                当前文件夹文件搜索切换
		" :Buffers              buffer文件搜索切换 
		" :BLines [QUERY]在当前buffer里查找包含某关键词的行
		" :Tags [QUERY]        以Tag查找 (ctags -R)"
		" :Marks
		" :Map                 映射键模糊查找       注 :map  :nmap 原始命令查看 映射配置
		" :Command             命令列表模糊查找     注 :command 查看命令列表
		" ...
	" 配置
		" 浮动配置(需要浮动支持 目前vim不支持 neovim支持)
			if has('nvim')
				" 让输入上方，搜索列表在下方
				let $FZF_DEFAULT_OPTS = '--layout=reverse'
			
				" 打开 fzf 的方式选择 floating window
				let g:fzf_layout = { 'window': 'call OpenFloatingWin()' }
			
				function! OpenFloatingWin()
					let height = &lines - 3
					let width = float2nr(&columns - (&columns * 2 / 10))
					let col = float2nr((&columns - width) / 2)
			
					" 设置浮动窗口打开的位置，大小等。
					" 这里的大小配置可能不是那么的 flexible 有继续改进的空间
					let opts = {
						\ 'relative': 'editor',
						\ 'row': height * 0.3,
						\ 'col': col + 30,
						\ 'width': width * 2 / 3,
						\ 'height': height / 2
						\ }
			
					let buf = nvim_create_buf(v:false, v:true)
					let win = nvim_open_win(buf, v:true, opts)
			
					" 设置浮动窗口高亮
					call setwinvar(win, '&winhl', 'Normal:Pmenu')
			
					setlocal
						\ buftype=nofile
						\ nobuflisted
						\ bufhidden=hide
						\ nonumber
						\ norelativenumber
						\ signcolumn=no
				endfunction
			endif
		"与其他软件集成(如ack、Rg/ripgrep)配置
		" 与Rg配合
			let g:rg_command = '
				\ rg --column --line-number --no-heading --fixed-strings --ignore-case --no-ignore --hidden --follow --color "always"
				\ -g "*.{js,json,php,md,styl,jade,html,config,py,cpp,c,go,hs,rb,conf}"
				\ -g "!{.git,node_modules,vendor}/*" '
			command! -bang -nargs=* Frg call fzf#vim#grep(g:rg_command .shellescape(<q-args>), 1, <bang>0)
			" 在命令模式下输入: Frg <关键词或空>
			
		" 与Ack配合
			let g:ack_command = 'ack'
			command! -bang -nargs=* Fack call fzf#vim#grep(g:ack_command .shellescape(<q-args>), 1, <bang>0)
			" 在命令模式下输入: Fack <关键词或空>
			
		" 与fd配合
			let g:fd_command = 'fd'
			command! -bang -nargs=* Ffd call fzf#vim#grep(g:fd_command .shellescape(<q-args>), 1, <bang>0)
			" 在命令模式下输入: Ffd <关键词或空>
		


	" >参考资料
		" + [Windows下基于FZF的模糊查找器](https://mounui.com/301.html)
		" + [Github jeesse23/with](https://github.com/jesse23/with)
		" + [VIM与模糊搜索神器FZF的集成用法 - 从简单到高级](https://segmentfault.com/a/1190000016186540?utm_source=tag-newest)
		" + [使用 neovim 的浮动窗口让你再次爱上 fzf](https://blog.csdn.net/simple_the_best/article/details/89279909)

" -----------------------------------------------------------------------------
" 文件内容搜索 jremmen/vim-ripgrep

	" 安装前提：需要安装ripgrep
		"    windows: (1)下载并安装ripgrep （如：ripgrep-11.0.2-x86_64-pc-windows-msvc.zip）
		"             (2). 解压到一个目录下，如创建一个目录 c:/tools_bin/ripgrep-11.0.2-x86_64-pc-windows-msvc，并将该目录添加到系统 PATH 环境变量
		"                 
		"    linux: Archlinux安装ripgrep: sudo pacman -S ripgrep
		"
		"    mac:安装ripgrep:brew install ripgrep

	" 使用说明
		" :Rg  要查找的字符       
	" 配置
	
	" 参考资料 

" -----------------------------------------------------------------------------
" 代码注释插件 preservim/nerdcommenter
" SpaceVim有内置的代码注释 该插件会与之冲突或被禁用了
" SpaceVim 有内置代码注释 <space>+c+l 、<sapce>+c+u <space>+c+L 
	" " 使用方法：
	"     " # <leader>cc // 注释
	"     " # <leader>cm 只用一组符号注释
	"     " # <leader>cA 在行尾添加注释
	"     " # <leader>c$ /* 注释 */
	"     " # <leader>cs /* 块注释 */
	"     " # <leader>cy 注释并复制
	"     " # <leader>c<space> 注释/取消注释
	"     " # <leader>ca 切换　// 和 /* */
	"     " # <leader>cu 取消注释
	"
	" " 配置
	"     " let g:NERDSpaceDelims = 1
	"     " let g:NERDDefaultAlign = 'left'
	"     " let g:NERDCustomDelimiters = {
	"     "             \ 'javascript': { 'left': '//', 'leftAlt': '/**', 'rightAlt': '*/' },
	"     "             \ 'less': { 'left': '/**', 'right': '*/' }
	"     "         \ }
	"
	"     " Add spaces after comment delimiters by default （默认情况下，在注释分隔符后添加空格）
	"     let g:NERDSpaceDelims = 1
	"
	"     " Use compact syntax for prettified multi-line comments （对经过修饰的多行注释使用紧凑语法）
	"     let g:NERDCompactSexyComs = 1
	"
	"     " Align line-wise comment delimiters flush left instead of following code indentation （按行对齐注释分隔符左对齐，而不是按代码缩进）
	"     let g:NERDDefaultAlign = 'left'
	"
	"     " Set a language to use its alternate delimiters by default （将语言设置为默认情况下使用其备用分隔符）
	"     let g:NERDAltDelims_java = 1
	"
	"     " Add your own custom formats or override the defaults（添加您自己的自定义格式或覆盖默认格式）
	"     let g:NERDCustomDelimiters = {
	"             \ 'c': { 'left': '/**','right': '*/' },
	"             \ 'javascript': { 'left': '//', 'leftAlt': '/**', 'rightAlt': '*/' },
	"             \ 'less': { 'left': '/**', 'right': '*/' },
	"        \ }
	"
	"     " Allow commenting and inverting empty lines (useful when commenting a region)(允许注释和反转空行（在注释区域时有用）)
	"     let g:NERDCommentEmptyLines = 1
	"
	"     " Enable trimming of trailing whitespace when uncommenting (取消注释时启用尾随空白的修剪)
	"     let g:NERDTrimTrailingWhitespace = 1
	"
	"     " Enable NERDCommenterToggle to check all selected lines is commented or not (启用NerdCommentToggle以检查所有选定行是否已注释)
	"     let g:NERDToggleCheckAllLines = 1
	" -----------------------------------------------------------------------------
	" 撤销更改/撤销树插件  vim-undotree  配置

	" 使用说明
		" 命令模式下输入:UndotreeToggle 打开窗口，可看到当前文件在vim之前的更改记录

	" 打开快捷键设置
	nnoremap <F3> :UndotreeToggle<CR>       " F3 打开undotree面板
	noremap <Leader>ud :UndotreeToggle<CR> " \ud 打开undotree面板

	"配置undotree产生的文件存放位置设置
	set undodir=$HOME\\.undodir
	set undofile
	if has("persistent_undo")
		set undodir=$HOME\\.undodir
		set undofile
	endif"

	"undotree窗口布局颜样式选择（目前有4种）
	if !exists('g:undotree_WindowLayout')
		let g:undotree_WindowLayout = 3
	endif


	"-----------------------------------------------------------------------------
	" git变动边沿显示插件 gitgutter  配置
	" 说明
	" 可以显式地关闭和打开vim gitgutter（默认为打开）：
		" 使用：GitGutterDisable关闭
		" 启用：GitGutterEnable
		" 切换方式：GitGutterToggle。
		
	" 要切换每个缓冲区的vim gitguitter，请执行以下操作：
		" 使用：GitGutterBufferDisable关闭
		" 使用：GitGutterBufferEnable启用
		" 切换方式：GitGutterBufferToggle
		
	" 您可以打开和关闭标志（默认为打开）：
		" 启用：GitGutterSignsEnable
		" 禁用：GitGutterSignsDisable
		" 切换方式：GitGutterSignsToggle。
	
	" 并且可以打开和关闭线条突出显示（默认为关闭）：
		" 启用：GitGutterLineHighlightsEnable
		" 禁用：GitGutterLineHighlightsDisable
		" 切换方式：GitGutterLineHighlightsToggle。 

	" 在hunks变化间跳转
		" 跳转到下一个 hunk (change)位置 ]c
		" 跳转到上一个 hunk (change)位置 [c.
		" 自己配置上下调整快捷键方法：如]h [h
				" nmap ]h <Plug>(GitGutterNextHunk)
				" nmap [h <Plug>(GitGutterPrevHunk)	
		" 可以使用：GitGutterQuickFix将所有的hunk加载到quickfix列表中。注意，这会忽略缓冲区中任何未保存的更改。如果设置了选项g:gitguitter_use_location_list，则此命令将把hunk加载到当前窗口的位置列表中。
		"  当光标位于某个块中时，您可以放置或撤消该块：
				" 用<Leader>hs或
				" 用<Leader>hu撤消它。
				" 预览hunk，例如<Leader>hp；
				" 移到预览窗口，例如：wincmd P；

		" 最后，可以使用：GitGutterAll 强制vim gitguitter在所有可见缓冲区中更新其符号。
		" 使用:GitGutterFold命令折叠所有未更改的行，只留下可见的块。使用zr在一个大块上下展开3行上下文。 



	" 配置
		" let g:gitgutter_highlight_lines = 1    " 打开行高亮(所在行整个背景颜色也高亮) turn on line highlighting by default
		let g:gitgutter_highlight_linenrs = 1  " 打开行数高亮 turn on line number highlighting by default
		let g:gitgutter_max_signs = 1000       " 设置最大的更改数（默认值为500）
		" let g:gitgutter_signs = 0
		" let g:gitgutter_map_keys = 0  " 关闭所有的映射按键
		" let g:gitgutter_override_sign_column_highlight = 0
		let g:gitgutter_override_sign_column_highlight = 1
		" let g:gitgutter_preview_win_floating = 1
		" " autocmd BufWritePost * GitGutter
		" nnoremap <LEADER>gf :GitGutterFold<CR>
		" " nnoremap H :GitGutterPreviewHunk<CR>
		" " nnoremap <LEADER>g- :GitGutterPrevHunk<CR>
		" " nnoremap <LEADER>g= :GitGutterNextHunk<CR>
		" set foldtext=gitgutter#fold#foldtext()
		" function! GitStatus()
		"   let [a,m,r] = GitGutterGetHunkSummary()
		"   return printf('+%d ~%d -%d', a, m, r)
		" endfunction
		" set statusline+=%{GitStatus()}

	"-----------------------------------------------------------------------------
	" git命令封装插件 vim-fugitive  配置

	" 命令映射
	"nnoremap <Leader>gs :Gstatus<CR>
	"nnoremap <Leader>gd :Gdiff<CR>
	"nnoremap <Leader>gc :Gcommit -m""
	"nnoremap <Leader>gb :Gblame<CR>
	"nnoremap <Leader>gl :Glog
	"nnoremap <Leader>gp :Gpush<CR>
	"nnoremap <Leader>gpp :Gpull<CR>

	"-----------------------------------------------------------------------------
" -----------------------------------------------------------------------------
" 插件  mhinz/vim-startify  配置

	" 使用说明

	" 配置
		"设置书签
		let g:startify_bookmarks            = [
					\ '~/_vimrc',
					\]

		"起始页显示的列表长度（是每个类型的数量,非总数）
		let g:startify_files_number = 6

		"自动加载session
		let g:startify_session_autoload = 1

		"过滤列表，支持正则表达式
		let g:startify_skiplist = [
				\ '^/tmp',
				\ ]

		"自定义Header和Footer
		" let g:startify_custom_header = [
		" \'         __  ____   __ __     _____ __  __ ____   ____  ',
		" \'        |  \/  \ \ / / \ \   / /_ _|  \/  |  _ \ / ___| ',
		" \'        | |\/| |\ V /   \ \ / / | || |\/| | |_) | |     ',
		" \'        | |  | | | |     \ V /  | || |  | |  _ <| |___  ',
		" \'        |_|  |_| |_|      \_/  |___|_|  |_|_| \_\\____| ',
		" \]
		" let g:startify_custom_footer = [
		" \'        +---------------------------------------------+ ',
		" \'        |     美妙人生的关键在于你能迷上什么东西!     | ',
		" \'        +--------------------+------------------------+ ',
		" \]

	" > 参考资料
		" + [Vim插件之startify](https://blog.csdn.net/demorngel/article/details/70911385)

" -----------------------------------------------------------------------------
	" 书签可视化插件  MattesGroeger/vim-bookmarks  配置

	" 使用说明
		" 功能                                    快捷键          命令
		" 添加/删除书签(当前行)                     mm        :BookmarkToggle
		" 添加/编辑/删除当前行注释书签              mi        :BookmarkAnnotate <TEXT>
		" 跳转到当前 buffer 的下一个书签            mn        :BookmarkNext
		" 跳转到当前 buffer 的前一个书签            mp        :BookmarkPrev
		" 在 quickfix 窗口中列出所有书签(toggle)    ma        :BookmarkShowAll
		" 清除当前 buffer 内的所有书签              mc        :BookmarkClear
		" 清除所有 buffer 内的书签                  mx        :BookmarkClearAll
		" 保存书签到文件                                      :BookmarkSave <FILE_PATH>
		" 从文件加载书签                                      :BookmarkLoad <FILE_PATH>
	
	" 配置
		highlight BookmarkSign ctermbg=NONE ctermfg=160
		highlight BookmarkLine ctermbg=194 ctermfg=NONE
		let g:bookmark_sign = '♥'                     " 书签符号设置（默认⚑）
		"let g:bookmark_annotation_sign = '##'          " 注释(说明)书签符号(默认☰)
		"let g:bookmark_highlight_lines = 1             " 默认值为0(否)，是否高亮显示书签行
		"let g:bookmark_no_default_key_mappings = 1     " 默认值为0(否)，是否使用默认的快捷键
		let g:bookmark_center = 1                      " 默认值为0(否)，是否跳转后的书签行居中
		let g:bookmark_show_warning = 0                " 默认值为1(是)，删除所有书签时，是否显示警告信息
		let g:bookmark_highlight_lines = 1             " 默认值为0(否)，是否高亮书签行
		let g:bookmark_auto_close = 1                  " 默认值为0(否)，在 quickfix 窗口选中书签后，是否自动关闭 quickfix 窗口
		let g:bookmark_save_per_working_dir = 1        " 默认值为0(否)，是否针对工作目录保存书签
		let g:bookmark_auto_save = 0                   " 默认值为1(是)，是否自动保存书签
		"let g:bookmark_auto_save_file = '/bookmarks'   " 默认值为$HOME .’/.vim-bookmarks’,存储书签的文件(bookmark_save_per_working_dir开启后此配置将被忽略)


	" > 参考资料
		" + [Hacking Vim: bookmarks(06)](https://www.it610.com/article/5490884.htm)

" -----------------------------------------------------------------------------
" vim8.1内置终端辅助插件skywind3000/vim-terminal-help  配置
	" 内置终端也分 normal/insert 两种模式，正常终端操作，输入文字是 insert 模式，在 insert 模式中按 <c-\><c-N> 就可以切换到终端 normal 模式了，然后你可以像 vim buffer 一样正常的 hjkl 漫游，正常的滚屏，复制内容。弄完了以后再按 i/a 回到 insert 模式中接着输入终端命令。
	" 使用说明
		" 第一：提供一个 ALT+= 的快捷键可以像 vscode 的 CTRL+backtick 一样用来打开 /关闭终端窗口，不用每次输入 :terminal，同时新终端会把 shell 的工作目录初始化成你上面正在编辑的文件所在的目录，因为你大部分时候临时想搞点什么一般都是针对你当前正在编辑的文件来操作，那么初始化成当前文件的目录就避免了你每次打开终端再 cd 
		" ALT+= 在正下方打开终端，路径自动帮你定位到上面文件所在目录; 运行完了就再 ALT+= 把它收起来，整个流程十分顺畅。多次 ALT+= 不会无止境的打开新终端，只会复用已有的，而如果你再终端里输入了 exit 结束了 shell 进程，那么再次按 ALT+= 才会创建一个新的终端。
		
		" 第二：初始化了一组快捷键 ALT+SHIFT+hjkl 用来在终端窗口和其他窗口之间跳转，很多 vim 用户过去都习惯设置 CTRL+hjkl 来做窗口跳转

		" 第三：在终端内提供一个名叫 drop 的命令，当你在终端中突然想编辑某个文件，直接 drop xxx 命令就能通知到外层的 vim 来打开该文件了，，
		

	" 配置
		"let g:terminal_key " 配置默认的切换 terminal 的热键，默认Alt+=  ( ALT+等于号)。
		"let g:terminal_cwd " 配置 shell 启动时候的目录 ;0 是 vim 当前目录 1 是当前编辑文件的所在目录 2 是当前文件的项目目录（包含 .git/.svn 的父目录）
	" > 参考资料
		" + [Vim/NeoVim 内置终端调教记](https://www.v2ex.com/t/637112)

" -----------------------------------------------------------------------------
" xxx插件  xxxx  配置

	" 使用说明

	" 配置

	" > 参考资料
		" + []()

" -----------------------------------------------------------------------------
" 模糊搜索插件 'Yggdroot/LeaderF' （需要python3特性支持）

	" 使用说明
		" 检索文件：<leader>f
		" 检索 buffer：<leader>b
		" 在 LeaderF 运行起来以后（在正常检索的模式下），可以执行下面的一些操作：
		" <C-C>, <ESC> : 退出 LeaderF. 
		" <C-R> : 在模糊匹配和正则式匹配之间切换
		" <C-F> : 在全路径搜索和名字搜索之间切换
		" <Tab> : 在检索模式和选择模式之间切换
		" <C-J>, <C-K> : 在结果列表里选择
		" <C-X> : 在水平窗口打开
		" <C-]> : 在垂直窗口打开
		" <C-T> : 在新标签打开
		" <C-P> : 预览结果
		" 在 LeaderF 检索文件的模式下，如果按 Tab 进入选择列表之后，会有其他的快捷键，可以通过 F1 来查看
	" 配置
		if has("python3")
				"添加面板说明
				call SpaceVim#custom#SPC('nore', [ 'f',  '/'], 'Leaderf file', 'search file', 1)
			
		endif

	" > 参考资料
		" + []()
" -----------------------------------------------------------------------------
" git提交记录树插件 junegunn/gv.vim    配置

	" 使用说明
		" Usage
		" Commands
		" :GV to open commit browser
		" You can pass git log options to the command, e.g. :GV -S foobar.
		" :GV! will only list commits that affected the current file
		" :GV? fills the location list with the revisions of the current file
		" :GV or :GV? can be used in visual mode to track the changes in the selected lines.
		" 
		" Mappings
		" o or <cr> on a commit to display the content of it
		" o or <cr> on commits to display the diff in the range
		" O opens a new tab instead
		" gb for :Gbrowse
		" ]] and [[ to move between commits
		" . to start command-line with :Git [CURSOR] SHA à la fugitive
		" q or gq to close

	" 配置

	" > 参考资料
		" + []()

" -----------------------------------------------------------------------------
" 插件可以给当前光标下的单词增加下划线插件 itchyny/vim-cursorword 

	" 使用说明

	" 配置

	" > 参考资料
		" + []()
" -----------------------------------------------------------------------------
" 可以使用不同颜色同时高亮多个单词，浏览或者给别人讲解代码的时候比较有用 lfv89/vim-interestingwords

	" 使用说明

	" 配置

	" > 参考资料
		" + []()

"-------------------------------------------------------------------------------
"可视区快速搜索移动插件 easymotion/vim-easymotion
	" 使用说明
		" 使用下面配置的快捷键打开后 输入相应的可视区内相应字符会高亮  
	" 配置
		" 配置启动快捷键 
		nmap ss <Plug>(easymotion-s2)

	" > 参考资料
		" + []()

"=============================================================================="
" 自定义函数配置

""""""""""""  自定义函数: 切换工作空间
""""""""""""  

	"function Cw(dir)
	"    execute ":cd  ".a:dir
	"endfunction

	" 使用说明：
		" 命令模式下输入 ：call Cw(prj_2) 快速切换到项目空间(前提是在配置里定义了prj_2的路径)

	" 配置例子1：
		" let g:prj_1 = "~/Desktop/tmp/prj_1" 
		" let g:prj_2 = "~/Desktop/tmp/prj_2"
		" let g:WorkDir = "~/tmp"  "相对路径写法  意为当前用户下的tmp目录
		" call Cw(WorkDir)
	" 配置例子2：
		" let g:MyWorkSpace = "C:/MyWorkSpace"
		" let g:CodeStudio = g:MyWorkSpace."/GitHub_Prj/"
		" call Cw(CodeStudio)

	"" 实际配置：
		" let g:WorkDir = "D:\MyWorkSpace"
		" call Cw(WorkDir)



""""""""""""  自定义函数: 快速输入时间
""""""""""""  

	" --实现方案一, 然后在编辑文件时，在输入模式下，输入 xdate 或 xdatetime 后按回车，便可输入以下格式的时间：
		iab xdate <c-r>=strftime("20%y.%m.%d")<cr> 
		iab xdatetime <c-r>=strftime("20%y/%m/%d %H:%M:%S")<cr> 
		iab xdatetime1 <c-r>=strftime("20%y/%m/%d %H:%M:%S %p (%A) %z")<cr> 

	" --实现方案二, linux系统的命令模式下 :r !date 

	" > 参考资料
	" + [Vim技能修炼教程(15) - 时间和日期相关函数](https://www.jianshu.com/p/172982c0a5f4)

""""""""""""  自定义函数: 获取当前目录路径
""""""""""""  

	" 将当前编辑的文件完全路径拷贝到系统剪贴板 --实现方案一
		" function GetCurFilePath()
		"     let cur_dir=getcwd()
		"     let dir_filename=cur_dir."\\"
		"     echo dir_filename.expand("%:r")."         done"
		"     call setreg('+',dir_filename)
		" endfunction

	" 将当前编辑的文件完全路径拷贝到系统剪贴板  --实现方案二
		function GetCurFilePath()
			let cur_dir=getcwd()
			let cur_file_name=getreg('%')
			let dir_filename=cur_dir."\\".cur_file_name
			echo dir_filename."         done"
			call setreg('+',dir_filename)
		endfunction

	" 使用说明
		" 命令模式下输入 ：call GetCurFilePath() 快速获取当前路径

	"" 快捷键设置
	"nnoremap <silent> <F9> : call GetCurFilePath()<cr>


""""""""""""  自定义函数:设置只有在是PHP文件时，才启用PHP补全 函数
""""""""""""  

	" 前提
		" 1、 配置步骤：首先下载PHP函数列表文件，将该文件保存在目录 /etc/vim/下:
		" 2、 设置php函数列表文件地址（前提将php_funclist.txt文件放在 ~/php_funclist.txt ）

	" 设置在针对所有文件都启用了PHP补全
	" 将函数列表文件引入补全配置中
	" set dictionary-=/etc/vim/php_funclist.txt  dictionary+=/etc/vim/php_funclist.txt
	" set dictionary-='C:/Program Files (x86)/Vim/vimfiles/php_funclist.txt'  dictionary+='C:/Program Files (x86)/Vim/vimfiles/php_funclist.txt'

	" 设置只有在是PHP文件时，才启用PHP补全
	au FileType php call PHPFuncList()

	function PHPFuncList()
		set dictionary-=~/.vim/completion_dictionary/php_funclist.txt dictionary+=~/.vim/completion_dictionary/php_funclist.txt
		set complete-=k complete+=k
	endfunction

	" 使用方法
		" 进入vim编辑的时候，按下 (control+p)或者 ，就可以出现php的自动补全。

	""""""""""""  自定义函数:打开当前文件所在位置的文件管理器窗口
	""""""""""""  

	"功能：当前文件所在位置，同时不阻塞当前窗口。


	function OpenFileLocation()
		if ( expand("%") != "" )
			execute "!start explorer /select, %" 
		else
			execute "!start explorer /select, %:p:h"
		endif
	endfunction
	
	function OpenFolderWithApp(name)
	"function ViewInBrowser(name)
		let path = expand("%:p:h")
		echo "当前位置：" . path
		if has('win32') || has('win64') || has('win16') || has('win95')
			let l:browsers = {
				\"explorer":"explorer \/select, %:p:h",
				\"PowerShell":"powershell.exe -noexit -command Set-Location -literalPath  %:p:h",
				\"Git-Gui":"C:\\Program Files\\Git\\cmd\\git-gui.exe  --working-dir ",
				\"Git-Bash":"C:\\Program Files\\Git\\git-bash.exe --cd=%:p:h",
			\}
			
			"C:\Program Files\Git\cmd\git-gui.exe" "--working-dir" "%1"
			"powershell.exe -noexit -command Set-Location -literalPath '%V'
			"C:\Users\CodeRooster\AppData\Local\Programs\Microsoft VS Code\Code.exe" "%V"
			"C:\Program Files\Git\git-bash.exe" "--cd=%1"

			" 执行命令用相应程序打开文件
			execute "!start "l:browsers[a:name]
		else
			let l:browsers = {
				\"ranger":"source ranger",
			\}
			execute "silent !"  l:browsers[a:name] file
		endif
	endfunction
	" 快捷方式映射 
	map gb <ESC>:call OpenFileLocation()<CR>

	" 使用说明
		" 命令模式下 输入 gb 打开当前所在文件夹
	
	" 自定命令
	:command Open       :call OpenFolderWithApp("explorer")<cr>          " 用文件管理器打开
	:command PowerShell :call OpenFolderWithApp("PowerShell")<cr>        " 在PowerShell打开
	":command Gitbash    :call OpenFolderWithApp("Git-Bash")<cr>          " 用Git-Bash打开
	":command Gitgui     :call OpenFolderWithApp("Git-Gui")<cr>           " 用Git-Gui打开


""""""""""""  自定义函数:使用系统上的软件打开当前文件夹或文件，同时不阻塞当前窗口。
""""""""""""  

	" 功能：使用第三方软件快速打开当前文件或当前文件夹，同时不阻塞当前窗口。
		" 例： 日志实时查看 BareTailProfessional 打开文件
		"        chrome、firefox浏览器打开预览

	function ViewInBrowser(name)
		let file = expand("%:p")
		echo "当前文件：" . file
		if has('win32') || has('win64') || has('win16') || has('win95')
			let l:browsers = {
				\"gvim":"gvim",
				\"Chrome":"C\:\\Program Files\ \(x86\)\\Google\\Chrome\\Application\\chrome.exe",
				\"FireFox":"C\:\\Program\ Files\\Mozilla\ Firefox\\firefox.exe",
				\"sublime_text3":"D:\\XWindowsToolSoftware\\Tool_Sublime_Text3_for_Windows\\SublimeText3\\sublime_text.exe",
				\"Notepad++":"C:\\Program\ Files\ \(x86\)\\Notepad++\\notepad++.exe",
				\"baregreppro":"D:\\XWindowsToolSoftware\\BareTailProfessional\\baregreppro.exe",
				\"baretailpro":"D:\\XWindowsToolSoftware\\BareTailProfessional\\baretailpro.exe",
				\"Typora":"C:\\Program Files\\Typora\\Typora.exe",
			\}
			" 执行命令用相应程序打开文件
			execute "!start "  l:browsers[a:name] file
		else
			let l:browsers = {
				\"gvim":"gvim",
				\"Chrome":"chromium",
				\"FireFox":"firefox",
				\"sublime_text3":"sublime-text",
				\"Typora":"typora",
				\}
			" 执行命令用相应程序打开文件
		execute "silent !"  l:browsers[a:name] file
		endif

	endfunction

	" 前缀键命令映射
	nmap <leader>cr    :call ViewInBrowser("Chrome")<cr>      " 用谷歌浏览器大开 
	nmap <leader>ff    :call ViewInBrowser("FireFox")<cr>     " 用火狐浏览器打开
	nmap <leader>bt    :call ViewInBrowser("baretailpro")<cr> " 用日志文件实时查看软件器Baretailpro打开当前文件

	" 自定命令
	:command Gvim        :call ViewInBrowser("gvim")<cr>          " 用Gvim再打开

	:command Chrome      :call ViewInBrowser("Chrome")<cr>        " 用谷歌浏览器大开 
	:command Firefox     :call ViewInBrowser("FireFox")<cr>       " 用火狐浏览器打开
	:command Baretail    :call ViewInBrowser("baretailpro")<cr>   " 用日志文件实时查看软件器Baretailpro打开当前文件
	:command Baregrep    :call ViewInBrowser("baregreppro")<cr>   " 用日志文件检索实时查看器baregreppr打开当前文件
	:command Sublime     :call ViewInBrowser("sublime_text3")<cr> " 用sublime_text3打开当前文件
	:command Notepad     :call ViewInBrowser("Notepad++")<cr>     " 用sublime_text3打开当前文件
	:command Typora      :call ViewInBrowser("Typora")<cr>        " 用MarkDown编辑查看器Typora打开


	" >参考资料
		" + [VIM 浏览器预览插件](https://mikecoder.cn/post/190/)
		" + [笨方法学Vimscript](https://www.kancloud.cn/kancloud/learn-vimscript-the-hard-way/49291)"


endfunction

"==============================================================================
"" 附：vim的 window 和 Linux 的区别    
	"" -----------------------------------------------------------------------------
	""                    |                          区       别 
	"" -----------------------------------------------------------------------------
	""      系统          |        windows        |        Linux
	"" -----------------------------------------------------------------------------
	""      可视块        |        ctrl+q         |       crtl+v
	""                    | 需要按住shift才能     |
	""                    |        选择块         |
	"" -----------------------------------------------------------------------------
	"" 注释：由于windows下编程习惯了保存就ctrl+s，在vim下ctrl+s整个putty终端就死了，
	""       原来ctrl+s在LINUX里是锁定屏幕的快捷键，解锁ctrl+q就可以了

